Objective-C 实例状态问题

silentwins 2018-12-17 12:49:20
抄了Cocoa的一个实例:


#import <Cocoa/Cocoa.h>

@interface ViewController : NSViewController
{
NSSpeechSynthesizer* _speechSynth;
}
- (IBAction)stopIt:(id)sender;
- (IBAction)sayIt:(id)sender;
@property (weak) IBOutlet NSTextField *textField;

@end




#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

// Do any additional setup after loading the view.
}


- (void)setRepresentedObject:(id)representedObject {
[super setRepresentedObject:representedObject];

// Update the view, if already loaded.
}

- (id)init {
self = [super init];
if (self) {
// Logs can help the beginner understand what
// is happening and hunt down bugs.
NSLog(@"init");

// Create a new instance of NSSpeechSynthesizer
// with the default voice.
_speechSynth = [[NSSpeechSynthesizer alloc] initWithVoice:@"com.apple.speech.synthesis.voice.Alex"];
}
return self;
}

- (IBAction)stopIt:(id)sender {
NSLog(@"stopping");
[_speechSynth stopSpeaking];
}

- (IBAction)sayIt:(id)sender {
NSString *string = [_textField stringValue];
// Is the string zero-length?
if ([string length] == 0) {
NSLog(@"string from %@ is of zero-length", _textField);
return; }
// _speechSynth = [[NSSpeechSynthesizer alloc] initWithVoice:nil];
// [_speechSynth setVoice:@"com.apple.speech.synthesis.voice.Alex"];
[_speechSynth startSpeakingString:string];
while([NSSpeechSynthesizer isAnyApplicationSpeaking] == true) {}
NSLog(@"Have started to say: %@", string);
}
@end


如果代码如现在所描述,代码到[_speechSynth startSpeakingString:string];这一行是发不出声音出来的,而且我调试到_speechSynth此时是nil;

如果把
// _speechSynth = [[NSSpeechSynthesizer alloc] initWithVoice:nil];
// [_speechSynth setVoice:@"com.apple.speech.synthesis.voice.Alex"];
[_speechSynth startSpeakingString:string];
前两行的注释取消掉,程序就能正常发出声音,此时_speechSynth也不为nil。

请教一下为什么会这样,_speechSynth为什么没有持久化?谢谢!
...全文
227 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuzesong 2018-12-18
  • 打赏
  • 举报
回复
在初始化方法里面,你通过 _speechSynth = [[NSSpeechSynthesizer alloc] initWithVoice:@"com.apple.speech.synthesis.voice.Alex"]; 初始化了_speechSynth, 在 [_speechSynth startSpeakingString:string]; 的前面,你又通过 _speechSynth = [[NSSpeechSynthesizer alloc] initWithVoice:nil]; [_speechSynth setVoice:@"com.apple.speech.synthesis.voice.Alex"]; 这两行代码又对_speechSynth进行了赋值,如果你说注释掉这两行代码,就可以正常播放声音, 那么我觉得 [[NSSpeechSynthesizer alloc] initWithVoice:nil] 这个方法返回的就是个nil, 你可以点进 initWithVoice 这个构造方法里面去看下,看看里面是不是判断了后面的参数,如果参数为nil,也返回空对象(nil),才出现你说的这个问题,跟持久化没有关系。
OBJECTIVE-C编程之道 IOS设计模式解析电子书+源代码 《Objective-C编程之道:iOS设计模式解析》是基于iOS的软件开发指南。书中应用GoF的经典设计模式,介绍了如何在代码中应用创建型模式、结构型模式和行为模式,如何设计模式以巩固应用程序,并通过设计模式实例介绍MVC在CocoaTouch框架中的工作方式。   《Objective-C编程之道:iOS设计模式解析》适用于那些已经具备Objective-C基础、想利用设计模式来提高软件开发效率的中高级iOS开发人员。 第一部分 设计模式初体验 第1章 你好,设计模式 1.1 这是一本什么书 1.2 开始前的准备 1.3 预备知识 1.4 似曾相识的设计 1.5 设计模式的起源——模型、视图和控制器 1.5.1 在模型对象中封装数据和基本行为 1.5.2 使用视图对象向用户展示信息 1.5.3 用控制器对象联系起模型和视图 1.5.4 作为复合设计模式的MVC 1.6 影响设计的几个问题 1.6.1 针对接口编程,而不是针对实现编程 1.6.2 @protocol与抽象基类 1.6.3 对象组合与类继承 1.7 本书用到的对象和类 1.7.1 类图 1.7.2 对象图 1.8 本书如何安排模式的讲解 1.9 总结 第2章 案例分析:设计一个应用程序 2.1 想法的概念化 2.2 界面外观的设计 2.3 架构设计 2.3.1 视图管理 2.3.2 如何表现涂鸦 2.3.3 如何表现保存的涂鸦图 2.3.4 用户操作 2.4 所用设计模式的回顾 2.5 总结 第二部分 对象创建 第3章 原型 3.1 何为原型模式 3.2 何时使用原型模式 3.3 浅复制与深复制 3.4 使用Cocoa Touch框架中的对象复制 3.5 为Mark聚合体实现复制方法 3.6 将复制的Mark用作“图样模板” 3.7 总结 第4章 工厂方法 4.1 何为工厂方法模式 4.2 何时使用工厂方法 4.3 为何这是创建对象的安全方法 4.4 在TouchPainter中生成不同画布 4.5 在Cocoa Touch框架中应用工厂方法 4.6 总结 第5章 抽象工厂 5.1 把抽象工厂应用到TouchPainter应用程序 5.2 在Cocoa Touch框架中使用抽象工厂 5.3 总结 第6章 生成器 6.1 何为生成器模式 6.2 何时使用生成器模式 6.3 构建追逐游戏中的角色 6.4 总结 第7章 单例 7.1 何为单例模式 7.2 何时使用单例模式 7.3 在Objective-C中实现单例模式 7.4 子类化Singleton 7.5 线程安全 7.6 在Cocoa Touch框架中使用单例模式 7.6.1 使用UIApplication类 7.6.2 使用UIAccelerometer类 7.6.3 使用NSFileManager类 7.7 总结 第三部分 接口适配 第8章 适配器 8.1 何为适配器模式 8.2 何时使用适配器模式 8.3 委托 8.4 用Objective-C协议实现适配器模式 8.5 用Objective-C的块在iOS 4中实现适配器模式 8.5.1 块引用的声明 8.5.2 块的创建 8.5.3 把块用作适配器 8.6 总结 第9章 桥接 9.1 何为桥接模式 9.2 何时使用桥接模式 9.3 创建iOS版虚拟仿真器 9.4 总结 第10章 外观 10.1 何为外观模式 10.2 何时使用外观模式 10.3 为子系统的一组接口提供简化的接口 10.4 在TouchPainter应用程序中使用外观模式 10.5 总结 第四部分 对象去耦 第11章 中介者 11.1 何为中介者模式 11.2 何时使用中介者模式 11.3 管理TouchPainter应用程序中的视图迁移 11.3.1 修改迁移逻辑的困难 11.3.2 集中管理UI交通 11.3.3 在Interface Builder中使用CoordinatingController 11.4 总结 第12章 观察者 12.1 何为观察者模式 12.2 何时使用观察者模式 12.3 在模型-视图-控制器中使用观察者模式 12.4 在Cocoa Touch框架中使用观察者模式 12.4.1 通知 12.4.2 键-值观察 12.5 在TouchPainter中更新CanvasView上的线条 12.6 总结 第五部分 抽象集合 第13章 组合 13.1 何为组合模式 13.2 何时使用组合模式 13.3 理解TouchPainter中Mark的使用 13.4 在Cocoa Touch框架中使用组合模式 13.5 总结 第14章 迭代器 14.1 何为迭代器模式 14.2 何时使用迭代器模式 14.3 在Cocoa Touch框架中使用迭代器模式 14.3.1 NSEnumerator 14.3.2 基于块的枚举 14.3.3 快速枚举 14.3.4 内部枚举 14.4 遍历Scribble的顶点 14.5 总结 第六部分 行为扩展 第15章 访问者 15.1 何为访问者模式 15.2 何时使用访问者模式 15.3 用访问者绘制TouchPainter中的Mark 15.4 访问者的其他用途 15.5 能不能用范畴代替访问者模式 15.6 总结 第16章 装饰 16.1 何为装饰模式 16.2 何时使用装饰模式 16.3 改变对象的“外表”和“内容” 16.4 为UIImage创建图像滤镜 16.4.1 通过真正的子类实现装饰 16.4.2 通过范畴实现装饰 16.5 总结 第17章 责任链 17.1 何为责任链模式 17.2 何时使用责任链模式 17.3 在RPG游戏中使用责任链模式 17.4 总结 第七部分 算法封装 第18章 模板方法 18.1 何为模板方法模式 18.2 何时使用模板方法 18.3 利用模板方法制作三明治 18.4 保证模板方法正常工作 18.5 向模板方法增加额外的步骤 18.6 在Cocoa Touch框架中使用模板方法 18.6.1 UIView类中的定制绘图 18.6.2 Cocoa Touch框架中的其他模板方法实现 18.7 总结 第19章 策略 19.1 何为策略模式 19.2 何时使用策略模式 19.3 在UITextField中应用验证策略 19.4 总结 第20章 命令 20.1 何为命令模式 20.2 何时使用命令模式 20.3 在Cocoa Touch框架中使用命令模式 20.3.1 NSInvocation对象 20.3.2 NSUndoManager 20.4 在TouchPainter中实现撤销与恢复 20.4.1 使用NSUndoManager实现绘图与撤销绘图 20.4.2 自制绘图与撤销绘图的基础设施 20.4.3 允许用户触发撤销与恢复 20.5 命令还能做什么 20.6 总结 第八部分 性能与对象访问 第21章 享元 21.1 何为享元模式 21.2 何时使用享元模式 21.3 创建百花池 21.4 总结 第22章 代理 22.1 何为代理模式 22.2 何时使用代理模式 22.3 用虚拟代理懒加载图像 22.4 在Cocoa Touch框架中使用代理模式 22.5 总结 第九部分 对象状态 第23章 备忘录 23.1 何为备忘录模式 23.2 何时使用备忘录模式 23.3 在TouchPainter中使用备忘录模式 23.3.1 涂鸦图的保存 23.3.2 涂鸦图的恢复 23.3.3 ScribbleMemento的设计与实现 23.4 Cocoa Touch框架中的备忘录模式 23.5 总结

29,027

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧