有什么用途:
static_castdynamic_castconst_castreinterpret_cast(type)valuetype(value)如何决定在哪些特定情况下使用哪个?
我有一个包含字符串列表的Excel电子表格.每个字符串由几个单词组成,但每个字符串中的单词数不同.
使用内置的Excel函数(无VBA),有没有办法隔离每个字符串中的最后一个单词?
例子:
Are you classified as human? -> human?
Negative, I am a meat popsicle -> popsicle
Aziz! Light! -> Light! 我最近尝试编译一个较旧的Xcode项目(曾经编译得很好),现在我看到了很多这种形式的错误:
error: writable atomic property 'someProperty' cannot pair a synthesized setter/getter with a user defined setter/getter
导致这些错误的代码模式总是如下所示:
// Interface:
@property (retain) NSObject * someProperty;
// Implementation:
@synthesize someProperty; // to provide the getter
- (void)setSomeProperty:(NSObject *)newValue
{
//..
}
Run Code Online (Sandbox Code Playgroud)
我可以看到为什么会生成错误.我告诉编译器合成我的属性访问器(getter和setter),然后立即手动覆盖setter.那段代码总是闻到一点点气味.
那么,这样做的正确方法是什么?如果我使用@dynamic而不是@synthesize,我将不得不写入getter.这是唯一的方法吗?
我正在使用NSUSerDefaults存储用户首选项.我记得在某处将键设置为常量是一个好主意 - 我同意.以下代码是我目前拥有的代码:
[[NSUserDefaults standardUserDefaults]
setObject:[NSNumber numberWithInt:polygon.numberOfSides]
forKey:@"polygonNumberOfSides"];
Run Code Online (Sandbox Code Playgroud)
我尝试将其更改为:
@implementation Controller
NSString const *kPolygonNumberOfSides = @"polygonNumberOfSides";
-(void)savePolygonInfo {
[[NSUserDefaults standardUserDefaults]
setObject:[NSNumber numberWithInt:polygon.numberOfSides]
forKey:kPolygonNumberOfSides];
}
Run Code Online (Sandbox Code Playgroud)
虽然这确实有效,但它会产生" warning: passing argument 1 of 'objectForKey:' discards qualifiers from pointer target type".我很想让我的代码免受编译器警告的影响.我该如何修复此警告?
我对Objective-C中的合成属性有一些疑问.完整列表如下,但基本问题是:编译器如何确保正确释放合成属性的ivars,即使我的代码可能包含或不包含dealloc中的release方法?
注意:我决定不将这些问题作为单独的问题发布,因为它们密切相关,并且因为有一些现有的问题涉及到个别问题,而没有真正了解问题的核心.
有些类似的问题:
设置:考虑具有单个属性的类:
@interface Person : NSObject
{
NSString * name;
}
@property (nonatomic, retain) name;
@end
Run Code Online (Sandbox Code Playgroud)
问题#1:最基本的案例:
@implementation Person
@synthesize name;
@end
Run Code Online (Sandbox Code Playgroud)
通过这种设置,我假设name每当一个Person对象被释放时它将自动释放.在我看来,编译器只是插入[name release]到dealloc方法中,就像我自己键入它一样.那是对的吗?
问题2:如果我选择dealloc为这个类编写我自己的方法,并且我省略了一个调用[name release],那会泄漏吗?
@implementation Person
@synthesize name;
- (void)dealloc { [super dealloc]; }
@end
Run Code Online (Sandbox Code Playgroud)
问题3:如果我选择dealloc为这个类编写我自己的方法,并且我包含一个调用[name release],那会导致双重释放,因为@synthesize已经为我处理了它吗?
@implementation Person
@synthesize name;
- (void)dealloc { [name release]; …Run Code Online (Sandbox Code Playgroud) compiler-construction memory-management properties objective-c
我有NSTableView几个文本列.默认情况下,dataCell这些列是Apple NSTextFieldCell类的一个实例,它可以执行各种奇妙的操作,但它会绘制与单元格顶部对齐的文本,并且我希望文本在单元格中垂直居中.
有一个内部标志NSTextFieldCell可以用来垂直居中文本,它工作得很漂亮.但是,由于它是一个内部标志,它的使用不受Apple的批准,它可能会在未来的版本中消失而不会发出警告.我目前正在使用这个内部标志,因为它简单而有效.Apple显然花了一些时间来实现这个功能,所以我不喜欢重新实现它的想法.
所以; 我的问题是:实现与Apple的NStextFieldCell完全相同的行为的正确方法是什么,但是绘制垂直居中的文本而不是顶部对齐?
为了记录,这是我目前的"解决方案":
@interface NSTextFieldCell (MyCategories)
- (void)setVerticalCentering:(BOOL)centerVertical;
@end
@implementation NSTextFieldCell (MyCategories)
- (void)setVerticalCentering:(BOOL)centerVertical
{
@try { _cFlags.vCentered = centerVertical ? 1 : 0; }
@catch(...) { NSLog(@"*** unable to set vertical centering"); }
}
@end
Run Code Online (Sandbox Code Playgroud)
使用如下:
[[myTableColumn dataCell] setVerticalCentering:YES];
Run Code Online (Sandbox Code Playgroud) 我正在寻找可以与Cocoa NSEvent类一起使用的可用密钥代码的完整列表.的NSEvent类有一个keyCode属性,该属性被定义为unsigned short.以下代码放置在适当的UI对象中时,将在按下键代码时回显它们:
- (void)keyDown:(NSEvent *)theEvent
{
NSLog(@"%d", [theEvent keyCode]);
}
Run Code Online (Sandbox Code Playgroud)
从这段代码中,我可以很容易地看到哪些代码与某些键匹配,但我想找到一个列出所有代码的官方文档.我希望Apple有一个头文件,看起来像这样:
enum {
...
NSKeyCodeLeftArrow = 123,
NSKeyCodeRightArrow = 124,
...
};
Run Code Online (Sandbox Code Playgroud)
但如果有的话,我还没有找到它.
我正在寻找一种告诉我的Cocoa应用程序退出的好方法.请放心,这不会用于生产代码.我只是在寻找一种简单的方法来运行一个测试,然后在调试期间关闭应用程序.
我发现exit(0);将关闭应用程序,但它绕过了所有正常的应用程序退出程序,我想保留所有这些程序.
基本上我想让事情好像用户从菜单中拉出"退出",但我希望它在我完成测试后自动发生.
我的代码目前看起来像这样:
#if (SUPERFANCY_TESTING_MODE)
[self doSomething];
exit(0); // <-- I need something better to go here
#endif
Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我希望用户在UITextField(或等效文件)中键入名称,然后当他们按下返回时,它会将该单词放在通常与标签相关联的蓝色气泡中.然后光标移动到可以添加更多"标签"的末尾.
在Mail应用程序的To,CC和BCC字段中添加联系人时,以及在Messages应用程序中选择联系人时,可以看到这一点.
这是怎么做到的?它是UIKit中提供的还是其他地方提供的东西?
非常感谢,
迈克尔
XCode的调试器控制台可以很容易地看到我的应用发出的任何调试消息NSLog(),但它总是在它们上面添加一个时间戳前缀:
2009-08-30 04:54:48.128 MyApp[94652:a0f] some log message
2009-08-30 04:54:50.647 MyApp[94652:a0f] another log message
...
Run Code Online (Sandbox Code Playgroud)
我没有使用这个前缀,它占用了很多空间.我有一种感觉它被硬编码到Apple的日志记录系统中,但以防万一有一个解决方案:
我可以让调试器控制台显示没有时间戳前缀的日志消息吗?
像这样的东西是完美的:
some log message
another log message
...
Run Code Online (Sandbox Code Playgroud) cocoa ×4
objective-c ×3
debugging ×2
properties ×2
xcode ×2
c++ ×1
c++-faq ×1
casting ×1
console ×1
events ×1
excel ×1
exit ×1
input ×1
iphone ×1
keyboard ×1
pointers ×1
settings ×1
uitextfield ×1
uitextview ×1