小编an0*_*an0的帖子

如何为NSManagedObject做完美的KVO?

这里的完美KVO包括两部分:正确添加观察者并正确删除观察者.

故事:

  1. 我使用一个UITableViewCell(单元格)来显示一个NSManagedObject(对象).
  2. 每个对象都有一些需要通过其单元格观察的动态属性.
  3. 并非所有对象都具有相同的观察属性集.我有选择地添加关键路径观察器,如下所示:

    if(object.thumbnail_pic_url)[object addObserver:cell forKeyPath:@"thumbnail_picture"options:0 context:NULL];

  4. 对象可以删除.删除对象时,我必须删除观察者.数据库非常庞大和复杂,所以我绝对不想注册所有单元格来接收moc通知,如NSManagedObjectContextObjectsDidChangeNotification.但是如果必须的话,我可以接受在对象中添加一个单元格ivar,即使它再次成为好的Modle-View-Controller设计模式.

问题:在删除对象时,如何正确删除对象中所有已注册密钥路径的观察者(单元格)?

事实上,这是一个很大的问题,可以分为两个小问题:

  1. 观察者删除代码的最佳位置在哪里?
  2. 如何确定要注销的关键路径?在删除对象后我无法查询其属性 - 这将导致无法填充的错误,因此我无法编写如下代码:

    if(object.thumbnail_pic_url)[object removeObserver:cell forKeyPath:@"thumbnail_picture"];

并且我不能盲目地删除未注册的密钥路径的观察者 - 异常(无法删除关键路径"thumbnail_picture"的观察者,因为它未被注册为观察者.)将被抛出.

core-data key-value-observing nsmanagedobject ios

7
推荐指数
1
解决办法
3032
查看次数

声明方法参数__autoreleasing有什么好处?

根据过渡到ARC发行说明:

__autoreleasing用于表示通过引用(id*)传递的参数,并在返回时自动释放.

例如:

-(BOOL)performOperationWithError:(NSError * __autoreleasing *)error;

但与上述相比,上述优点有哪些:

-(BOOL)performOperationWithError:(NSError * __strong *)error;


更新:

几个答案是指临时VAR招编译器处理为var和参数之间的不匹配的优势__autoreleasing.我不明白为什么编译器不能为__strong参数做同样的技巧.我的意思是,对于__weakvar和__strong参数,编译器可以类似地执行此操作:

NSError * __weak error;
NSError * __strong tmp = error;
BOOL OK = [myObject performOperationWithError:&tmp];
error = tmp;
if (!OK) {
    // Report the error.
}
Run Code Online (Sandbox Code Playgroud)

编译器知道-(BOOL)performOperationWithError:(NSError * __strong *)error;返回一个强引用(+1),所以它像任何new-family方法一样处理它.由于tmp生活在相同的范围内error,编译器可以合理地保持它活着,只要error这样__weak引用(error)现在由__strongreference(tmp)支持,并且在范围结束之前不会无效.

objective-c automatic-ref-counting

7
推荐指数
1
解决办法
753
查看次数

CTLineGetTypographicBounds的问题

代码是从SimpleTextInput sampe代码中提取的,稍作修改.

创建框架:

self.font = [UIFont systemFontOfSize:18.f];
CTFontRef ctFont = CTFontCreateWithName((CFStringRef) self.font.fontName, self.font.pointSize, NULL);        
self.attributes = [[NSDictionary dictionaryWithObject:(id)ctFont forKey:(NSString *)kCTFontAttributeName] retain];
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:self.text attributes:self.attributes];    

_framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attributedString);

// Create the Core Text frame using our current view rect bounds
UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.bounds];
_frame =  CTFramesetterCreateFrame(_framesetter, CFRangeMake(0, 0), [path CGPath], NULL);
Run Code Online (Sandbox Code Playgroud)

线下面是帧(由获得的任何线CTFrameGetLines(_frame)):

CGFloat ascent, descent, leading;
CTLineGetTypographicBounds(line, &ascent, &descent, &leading);
CGPoint origin;
CTFrameGetLineOrigins(_frame, CFRangeMake(i, 1), &origin);
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 从CTLineGetTypographicBounds或ctFont获得的上升是13.860352,而self.font.ascender是16.860352.这3点差异来自哪里? …

core-text ios

6
推荐指数
1
解决办法
2874
查看次数

如何制作使用彩​​色位图图像的Apple Color Emoji.ttf字体?

我想制作一个颜色位图字体与PNG图像相同的格式,Apple Color Emoji.ttf以便它可以在iOS应用程序中使用.但我找不到任何参考资料.可能吗?如果是这样,怎么样?

fonts ios emoji

6
推荐指数
1
解决办法
2839
查看次数

Clang警告:永远不会读取在初始化期间存储到"池"的值

- (void)main {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Warning goes here

    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
    while (YES) {
        NSAutoreleasePool *subPool = [[NSAutoreleasePool alloc] init];
        [runLoop run];
        [subPool drain];
    }

    [pool drain];
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这个代码得到这样的警告,尤其是当它几乎完全一样的结构由Xcode中自身产生的main.m其主要功能并没有得到同样的警告:

int main(int argc, char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}
Run Code Online (Sandbox Code Playgroud)

objective-c clang ios

5
推荐指数
1
解决办法
1077
查看次数

如何在NSFetchedResultsChangeUpdate中使用newIndexPath?

我想我得到了它.但是我在我的应用程序中发现的新崩溃说不然.因此,任何人知道真正正确的代码NSFetchedResultsChangeUpdatenewIndexPath是非零和不一样的indexPath-controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:

core-data uitableview nsfetchedresultscontroller ios

5
推荐指数
1
解决办法
1239
查看次数

如何在更改Emacs中的缩进宽度后重新缩进Python代码?

我改变python-indent为3〜4我再mark-whole-bufferindent-for-tab-command.它给了我垃圾.

python emacs

5
推荐指数
1
解决办法
2014
查看次数

可以在后台线程上安全地使用NSLayoutManager吗?

即使iOS文档说:

只要应用程序保证从单个线程访问,就可以从子线程访问NLayoutManager,NSTextStorage和NSTextContainer.

我偶尔遇到这个例外:

由于未捕获的异常'NSInternalInconsistencyException'终止应用程序,原因:'只在主线程上运行!'

这是回溯:

Exception Type:  SIGABRT
Exception Codes: #0 at 0x197bca58c
Crashed Thread:  7

Application Specific Information:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Only run on the main thread!'

Last Exception Backtrace:
0   CoreFoundation                       0x000000018afd2f50 __exceptionPreprocess + 132
1   libobjc.A.dylib                      0x00000001974dc1fc objc_exception_throw + 56
2   CoreFoundation                       0x000000018afd2e10 +[NSException raise:format:arguments:] + 112
3   Foundation                           0x000000018bb0ae20 -[NSAssertionHandler handleFailureInFunction:file:lineNumber:description:] + 84
4   UIFoundation                         0x00000001940f0654 -[NSLayoutManager(NSPrivate) _resizeTextViewForTextContainer:] + 412
5   UIFoundation                         0x00000001940f0318 -[NSLayoutManager(NSPrivate) _recalculateUsageForTextContainerAtIndex:] + 1748
6   UIFoundation                         0x000000019411ec2c …
Run Code Online (Sandbox Code Playgroud)

nslayoutmanager ios textkit

5
推荐指数
1
解决办法
909
查看次数

kCGBitmapByteOrderDefault 到底是什么?

该文档同义反复地解释kCGBitmapByteOrderDefault为:

默认字节顺序。

但这个默认字节顺序到底是什么?

core-graphics ios

5
推荐指数
0
解决办法
515
查看次数

为什么“bundle install”需要“sudo”来实现这个“gem env”?

管道相关输出Jenkins

+ gem env
RubyGems Environment:
  - RUBYGEMS VERSION: 2.6.14
  - RUBY VERSION: 2.4.2 (2017-09-14 patchlevel 198) [x86_64-darwin16]
  - INSTALLATION DIRECTORY: /Users/jenkins/.rbenv/shims
  - USER INSTALLATION DIRECTORY: /Users/jenkins/.gem/ruby/2.4.0
  - RUBY EXECUTABLE: /usr/local/opt/ruby/bin/ruby
  - EXECUTABLE DIRECTORY: /Users/jenkins/.rbenv/shims/bin
  - SPEC CACHE DIRECTORY: /Users/jenkins/.gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /usr/local/Cellar/ruby/2.4.2_1/etc
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-darwin-16
  - GEM PATHS:
     - /Users/jenkins/.rbenv/shims
     - /Users/jenkins/.gem/ruby/2.4.0
     - /usr/local/lib/ruby/gems/2.4.0
     - /usr/local/Cellar/ruby/2.4.2_1/lib/ruby/gems/2.4.0
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false …
Run Code Online (Sandbox Code Playgroud)

bundler jenkins

5
推荐指数
0
解决办法
813
查看次数